package com.yy.micro.magic.core.context;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
 /**
   * @author YY
   * @version 1.0.0
   * @update 2021/9/19 9:55 下午
   * @description: 资源工厂，用于管理Magic cube运行时所需要的外部资源，常用的资源{@link com.yy.micro.magic.core.model.PlanSchedule} 和
  * {@link com.yy.micro.magic.ext.domain.code.CodeMap}，add与set区别是，set会把已存在的覆盖，add是追加。
 */
public interface ResourceFactory <K,V>{

    void set(K key,V value);

    void add(K key,V value);

     /**
      * 从资源中获取value，类型为默认类型
      * @param key
      * @return
      */
    V getValue(K key);
    /**
     * @description: 从资源中获取某个Key的值，指定了返回类型
     * @update 2021/9/19
    */
    <T>T getValue(K key,Class<T> cls);

    /**
     *
     */
    static class Impl implements ResourceFactory<String,Object>{

        private Map<String,Object> resources = new ConcurrentHashMap<>();
        @Override
        public void set(final String key, final Object value) {
            resources.put(key,value);
        }

        @Override
        public void add(final String key, final Object value) {
            if (!resources.containsKey(key)){
                set(key, value);
            }
        }

        @Override
        public Object getValue(final String key) {
            return resources.get(key);
        }

        @Override
        public <T> T getValue(final String key, final Class<T> cls) {
            Object value = getValue(key);
            if (null != value){
                if (value instanceof  ResourceFactory){
                    return ((ResourceFactory<String, Object>) value).getValue(key,cls);
                }
                return (T) value;
            }
            return null;
        }

        public static Impl create(){
            return new Impl();
        }
    }
}
